package com.kingwang.demo.springsecuritytokendemo.security;

import org.springframework.security.core.userdetails.UserDetails;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 基于Token的Session接口
 * 不使用HttpSession实现，需要自行维护Session创建、过期等业务逻辑
 */
public interface TokenSession {
    /**
     * 获取Session ID
     *
     * @return
     */
    String getId();

    /**
     * 获取Token类型
     * 通常类型为Bearer
     *
     * @return
     */
    String getType();

    /**
     * 获取Token值
     *
     * @return
     */
    String getToken();

    /**
     * 获取用户名
     *
     * @return
     */
    String getUsername();

    /**
     * 获取Session创建时间
     *
     * @return
     */
    LocalDateTime getCreationTime();

    /**
     * 获取最近活动时间
     *
     * @return
     */
    LocalDateTime getLastActiveTime();

    /**
     * 获取用户信息
     *
     * @return
     */
    UserDetails getUserDetails();

    /**
     * 获取所有额外设置的属性信息
     *
     * @return
     */
    Map<String, String> getAttributes();

    /**
     * 获取单个属性值
     *
     * @param name
     * @return
     */
    String getAttribute(String name);

    /**
     * 设置单个属性值
     *
     * @param name
     * @param value
     */
    void setAttribute(String name, String value);

    /**
     * 删除单个属性值
     *
     * @param name
     */
    void removeAttribute(String name);

    /**
     * 清空额外属性值
     */
    void clearAttributes();

    /**
     * 销毁Session
     * 如果存在Session缓存，应同时清除对应的缓存数据
     * 如果数据库中保存了对应的Session数据，应同时删除数据库中的数据
     * 使用 {@link TokenSessionManager} 中的相关方法实现具体业务逻辑
     */
    void destroy();
}
